package ar.uade.edu.fain.ad.server.business;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import ar.uade.edu.fain.ad.common.exception.FacturaYaPagadaException;
import ar.uade.edu.fain.ad.common.exception.PedidoFacturadoException;
import ar.uade.edu.fain.ad.common.transfer.FacturaVO;


public class Factura {

	private Long id;
	private List<ItemFactura> items;
	private Set<Pedido> pedidos;
	private MedioPago medioPago;
	private Date fecha;
	private Caja caja;
	private Double total;

	public Factura() {
		super();
		this.total = 0D;
		this.items = new ArrayList<ItemFactura>();
		this.pedidos = new HashSet<Pedido>();
		this.fecha = Calendar.getInstance().getTime();
	}	

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public List<ItemFactura> getItems() {
		return items;
	}

	public void setItems(List<ItemFactura> items) {
		this.items = items;
	}

	public Set<Pedido> getPedidos() {
		return pedidos;
	}

	public void setPedidos(Set<Pedido> pedidos) {
		this.pedidos = pedidos;
	}

	public MedioPago getMedioPago() {
		return medioPago;
	}

	public void setMedioPago(MedioPago medioPago) {
		this.medioPago = medioPago;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public Caja getCaja() {
		return caja;
	}

	public void setCaja(Caja caja) {
		this.caja = caja;
	}

	public Double getTotal() {
		return total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

	public boolean isPaga() {
		return getMedioPago() != null;
	}

	public void confeccionar(final Set<Pedido> pedidos) 
			throws PedidoFacturadoException {
		this.total = 0D;
		for (Pedido pedido : pedidos) {
			if (pedido.isFacturado()) {
				throw new PedidoFacturadoException(pedido.toVO());
			}
			for (Comanda comanda : pedido.getComandas()) {
				ItemFactura item = new ItemFactura();
				item.setCantidad(comanda.getCantidad());
				item.setPlatoFacturado(comanda.getPlato());
				getItems().add(item);
				this.total += item.getValor();
			}
			pedido.setFactura(this);
			getPedidos().add(pedido);
		}
	}
	
	public void pagar(MedioPago medioPago) throws FacturaYaPagadaException {
		if (isPaga()) {
			throw new FacturaYaPagadaException(toVO());
		}
		setMedioPago(medioPago);
	}
	
	public FacturaVO toVO() {
		FacturaVO vo = new FacturaVO();
		vo.setId(getId());
		vo.setFecha(getFecha());
		if (isPaga()) {
			vo.setMedioPago(getMedioPago().toVO());
		}
		vo.setTotal(getTotal());
		return vo;
	}
	
}
